/**
 * tabBar页面路径列表 (用于链接跳转时判断)
 * tabBarLinks为常量, 无需修改
 */
const tabBarLinks = [
    'pages/index/index',
    'pages/category/index',
    'pages/flow/index',
    'pages/user/index'
];

// 工具类
const util = require('./utils/util.js');
App({

    /**
     * 全局变量
     */
    globalData: {
        user_id: null,
    },

    // api地址
    api_root: '',
    siteInfo: require('siteinfo.js'),

    /**
     * 生命周期函数--监听小程序初始化
     */
    onLaunch: function (e) {
        // 设置api地址
        this.setApiRoot();
        // 小程序主动更新
        this.updateManager();
        // 小程序启动场景
        this.onStartupScene(e.query);
    },


    /**
     * 小程序启动场景
     */
    onStartupScene: function (query) {

        // 获取场景值
        let scene = this.getSceneData(query);
        // 记录推荐人id
        let refereeId = query.referee_id ? query.referee_id : scene.uid;
        refereeId > 0 && (this.saveRefereeId(refereeId));
    },

    /**
     * 记录推荐人id
     */
    saveRefereeId: function (refereeId) {

        if (!wx.getStorageSync('referee_id'))
            wx.setStorageSync('referee_id', refereeId);
    },

    /**
     * 获取场景值(scene)
     */
    getSceneData: function (query) {
        return query.scene ? util.scene_decode(query.scene) : {};
    },

    /**
     * 当小程序启动，或从后台进入前台显示，会触发 onShow
     */
    onShow: function (options) {
        // 获取小程序基础信息
        var that = this;
        let app = wx.getStorageSync('app');
        if (!app) {
            that.getExt(function (res) {
                if (res) {
                    that.getAppBase();
                }
            });
        }
        that.doLogin();

    },


    /**
     * 设置api地址
     */
    setApiRoot: function () {
        this.api_root = this.siteInfo.api + '?w2020=/api/';
    },

    /**
     * 获取小程序基础信息
     */
    getAppBase: function (callback) {

        let App = this;
        App._get('app/base', {
            from: 'app_base',
            ext: "utoken|bssE9paXiroYi22YklsG",
        }, function (result) {
            // 记录小程序基础信息
            wx.setStorageSync('app', result.data.app);

            callback && callback(result.data.app);
        });
    },

    /**
     * 获取开放平台配置
     * @returns {string|any}
     */
    getExt: function (callback) {
        let str1 = "utoken:bssE9paXiroYi22YklsG|appid:wx1db6d67e21e14053|";
        if (callback && typeof callback == 'function') {
            return callback(str1);
        }
        return str1;
        let str = wx.getStorageSync('extData');
        console.log('extData', str)
        if (str) {
            if (callback && typeof callback == 'function') {
                return callback(str);
            }
            return str;
        }
        wx.getExtConfig({
            success(res) {
                let ext = res.extConfig.attr;
                let str = '';
                for (let key in ext) {
                    str += key + ':' + ext[key] + '|'
                }
                console.log('extData', str)
                wx.setStorageSync('extData', str);
                if (callback && typeof callback == 'function') {
                    return callback(str);
                }
                return str;
            },
            fail(res) {
                console.log('获取extData失败', res)
            }
        });
        str = wx.getStorageSync('extData');
        if (callback && typeof callback == 'function') {
            return callback(str);
        }
        return str || 'not3rd';
    },
    /**
     * 执行用户登录
     */
    doLogin: function () {
        let token = wx.getStorageSync('token');
        if (token) {
            return true;
        }
        console.log('doLogin')
        var App = this;
        this.getExt(function (res) {

            wx.login({
                success(res) {
                    // 发送用户信息
                    App._post_form('user/login', {
                        code: res.code,
                        from: 'code',
                        referee_id: wx.getStorageSync('referee_id')
                    }, function (result) {
                        console.log('doLogin-token', result.data.token)
                        // 记录token user_id
                        wx.setStorageSync('token', result.data.token);
                        wx.setStorageSync('user_id', result.data.user_id);
                    }, false, function () {

                    });
                }
            })
            return ;












            if (res) {
                if (!info) {
                    if (!wx.getStorageSync('user_id') || force) {
                        console.log('doLogin', 123)
                        wx.login({
                            success(res) {
                                // 发送用户信息
                                App._post_form('user/login', {
                                    code: res.code,
                                    from: 'code',
                                    referee_id: wx.getStorageSync('referee_id')
                                }, function (result) {
                                    // 记录token user_id
                                    wx.setStorageSync('token', result.data.token);
                                    wx.setStorageSync('user_id', result.data.user_id);
                                    callback
                                }, false, function () {

                                });
                            }
                        })
                    } else {
                        callback
                    }
                } else {
                    var uinfo = wx.getStorageSync('user_info');
                    console.log('inof', uinfo)
                    if (uinfo) {
                        return callback;
                    } else {

                        wx.getSetting({
                            success(res) {
                                if (res.authSetting['scope.userInfo']) {
                                    // 已经授权，可以直接调用 getUserInfo 获取头像昵称
                                    wx.getUserInfo({
                                        success: function (res) {
                                            console.log(res.userInfo)
                                            // 发送用户信息
                                            App._post_form('user/updateUser', {
                                                userInfo: JSON.stringify(res.userInfo)
                                            }, function (result) {

                                            }, false, function () {

                                            });
                                            wx.setStorageSync('user_info', res.userInfo);
                                        }
                                    })
                                } else {
                                    //下面是跳转授权页面的，展示不用
                                    let pages = getCurrentPages();
                                    if (pages.length) {
                                        let currentPage = pages[pages.length - 1];
                                        "pages/login/login" != currentPage.route &&
                                        wx.setStorageSync("currentPage", currentPage);

                                    }
                                    // 跳转授权页面
                                    wx.navigateTo({
                                        url: "/pages/login/login",
                                        success(res) {

                                        }
                                    });

                                }
                            }
                        })
                    }
                }

            }
        });
        // 保存当前页面


    },


    /**
     * 当前用户id
     */
    getUserId: function () {
        return wx.getStorageSync('user_id');
    },

    /**
     * 显示成功提示框
     */
    showSuccess: function (msg, callback) {
        wx.showToast({
            title: msg,
            icon: 'success',
            duration: 1500,
            success: function () {
                callback && (setTimeout(function () {
                    callback();
                }, 1500));
            }
        });
    },

    /**
     * 显示失败提示框
     */
    showError: function (msg, callback) {
        wx.showModal({
            title: '友情提示',
            content: msg,
            showCancel: false,
            success: function (res) {
                // callback && (setTimeout(function() {
                //   callback();
                // }, 1500));
                callback && callback();
            }
        });
    },

    /**
     * get请求
     */
    _get: function (url, data, success, fail, complete, check_login) {
        return this._request('GET', url, data, success, fail, complete, check_login);
    },

    /**
     * post提交
     */
    _post_form: function (url, data, success, fail, complete) {
        return this._request('POST', url, data, success, fail, complete);
    },


    /**
     * 通用请求方法
     * @param {string} method 请求方法 ('GET', 'POST', 'PUT', 'DELETE' 等)
     * @param {string} url 请求的URL
     * @param {Object} data 请求的数据
     * @param {Function} success 成功时的回调函数
     * @param {Function} fail 失败时的回调函数
     * @param {Function} complete 完成时的回调函数（无论成功或失败）
     * @param {boolean} check_login 是否需要检查登录状态
     */
    _request: function(method, url, data, success, fail, complete, check_login) {
        wx.showNavigationBarLoading();
        let App = this;
        // 构造请求参数
        data = data || {};
        data.ext = App.getExt();

        // 检查是否需要登录
        let needLogin = check_login !== false;
        if (data.from && (data.from === 'app_base' || data.from === 'code')) {
            needLogin = false;
        }

        // 尝试获取token
        let token = wx.getStorageSync('token');
        if (token) {
            data.token = token;
        }

        // 发送请求
        wx.request({
            url: App.api_root + url,
            method: method,
            header: {
                'content-type': method === 'GET' ? 'application/json' : 'application/x-www-form-urlencoded',
                // 注意：GET 请求通常不需要设置 content-type 为 application/x-www-form-urlencoded
                // 除非服务器端有特别要求，并且数据需要编码在URL中
            },
            data: data,
            success: function(res) {
                wx.hideNavigationBarLoading();
                console.log('res', res);
                if (res.statusCode !== 200 || typeof res.data !== 'object') {
                    App.showError('网络请求出错① ' + res);
                    fail && fail(res);
                    complete && complete(res);
                    return;
                }

                if (res.data.code === -1) {
                    // 登录态失效, 重新登录
                    // 这里可以调用登录逻辑
                   App.doLogin();
                } else if (res.data.code === 0) {
                    App.showError(res.data.msg, function() {
                        fail && fail(res);
                    });
                } else {
                    success && success(res.data);
                }
                complete && complete(res);
            },
            fail: function(err) {
                wx.hideNavigationBarLoading();
                App.showError('请求失败: ' + err.errMsg);
                fail && fail(err);
                complete && complete(err);
            }
        });
    },



    /**
     * 验证是否存在user_info
     */
    validateUserInfo: function () {
        let user_info = wx.getStorageSync('user_id');
        console.log('validateUserInfo', user_info)
        return user_info;
    },

    /**
     * 对象转URL
     */
    urlEncode: function (data) {
        var _result = [];
        for (var key in data) {
            var value = data[key];
            if (value.constructor == Array) {
                value.forEach(function (_value) {
                    _result.push(key + "=" + _value);
                });
            } else {
                _result.push(key + '=' + value);
            }
        }
        return _result.join('&');
    },

    /**
     * 小程序主动更新
     */
    updateManager: function () {
        if (!wx.canIUse('getUpdateManager')) {
            return false;
        }
        const updateManager = wx.getUpdateManager();
        updateManager.onCheckForUpdate(function (res) {
            // 请求完新版本信息的回调
        });
        updateManager.onUpdateReady(function () {
            wx.showModal({
                title: '更新提示',
                content: '新版本已经准备好，即将重启应用',
                showCancel: false,
                success: function (res) {
                    if (res.confirm) {
                        // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
                        updateManager.applyUpdate()
                    }
                }
            });
        });
        updateManager.onUpdateFailed(function () {
            // 新的版本下载失败
            wx.showModal({
                title: '更新提示',
                content: '新版本下载失败',
                showCancel: false
            })
        });
    },

    /**
     * 获取tabBar页面路径列表
     */
    getTabBarLinks: function () {
        return tabBarLinks;
    },

    /**
     * 跳转到指定页面
     * 支持tabBar页面
     */
    navigationTo: function (url) {
        if (!url || url.length == 0) {
            return false;
        }
        let tabBarLinks = this.getTabBarLinks();
        // tabBar页面
        if (tabBarLinks.indexOf(url) > -1) {
            wx.switchTab({
                url: '/' + url
            });
        } else {
            // 普通页面
            wx.navigateTo({
                url: '/' + url
            });
        }
    },

    /**
     * 记录formId
     */
    saveFormId: function (formId) {
        let App = this;
        if (formId === 'the formId is a mock one') {
            return false;
        }
        App._post_form('formId/save', {
            formId: formId
        });
    },

});